home *** CD-ROM | disk | FTP | other *** search
- package java.io;
-
- import java.security.AccessController;
- import sun.security.action.GetBooleanAction;
-
- public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants {
- private final BlockDataOutputStream bout;
- private final HandleTable handles;
- private final ReplaceTable subs;
- private int protocol = 2;
- private int depth;
- private byte[] primVals;
- private final boolean enableOverride;
- private boolean enableReplace;
- private Object curObj;
- private ObjectStreamClass curDesc;
- private PutFieldImpl curPut;
- private final DebugTraceInfoStack debugInfoStack;
- private static final boolean extendedDebugInfo = (Boolean)AccessController.doPrivileged(new GetBooleanAction("sun.io.serialization.extendedDebugInfo"));
-
- public ObjectOutputStream(OutputStream var1) throws IOException {
- this.verifySubclass();
- this.bout = new BlockDataOutputStream(var1);
- this.handles = new HandleTable(10, 3.0F);
- this.subs = new ReplaceTable(10, 3.0F);
- this.enableOverride = false;
- this.writeStreamHeader();
- this.bout.setBlockDataMode(true);
- if (extendedDebugInfo) {
- this.debugInfoStack = new DebugTraceInfoStack();
- } else {
- this.debugInfoStack = null;
- }
-
- }
-
- protected ObjectOutputStream() throws IOException, SecurityException {
- SecurityManager var1 = System.getSecurityManager();
- if (var1 != null) {
- var1.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
- }
-
- this.bout = null;
- this.handles = null;
- this.subs = null;
- this.enableOverride = true;
- this.debugInfoStack = null;
- }
-
- public void useProtocolVersion(int var1) throws IOException {
- if (this.handles.size() != 0) {
- throw new IllegalStateException("stream non-empty");
- } else {
- switch (var1) {
- case 1:
- case 2:
- this.protocol = var1;
- return;
- default:
- throw new IllegalArgumentException("unknown version: " + var1);
- }
- }
- }
-
- public final void writeObject(Object var1) throws IOException {
- if (this.enableOverride) {
- this.writeObjectOverride(var1);
- } else {
- try {
- this.writeObject0(var1, false);
- } catch (IOException var3) {
- if (this.depth == 0) {
- this.writeFatalException(var3);
- }
-
- throw var3;
- }
- }
- }
-
- protected void writeObjectOverride(Object var1) throws IOException {
- }
-
- public void writeUnshared(Object var1) throws IOException {
- try {
- this.writeObject0(var1, true);
- } catch (IOException var3) {
- if (this.depth == 0) {
- this.writeFatalException(var3);
- }
-
- throw var3;
- }
- }
-
- public void defaultWriteObject() throws IOException {
- if (this.curObj != null && this.curDesc != null) {
- this.bout.setBlockDataMode(false);
- this.defaultWriteFields(this.curObj, this.curDesc);
- this.bout.setBlockDataMode(true);
- } else {
- throw new NotActiveException("not in call to writeObject");
- }
- }
-
- public PutField putFields() throws IOException {
- if (this.curPut == null) {
- if (this.curObj == null || this.curDesc == null) {
- throw new NotActiveException("not in call to writeObject");
- }
-
- this.curPut = new PutFieldImpl(this, this.curDesc);
- }
-
- return this.curPut;
- }
-
- public void writeFields() throws IOException {
- if (this.curPut == null) {
- throw new NotActiveException("no current PutField object");
- } else {
- this.bout.setBlockDataMode(false);
- this.curPut.writeFields();
- this.bout.setBlockDataMode(true);
- }
- }
-
- public void reset() throws IOException {
- if (this.depth != 0) {
- throw new IOException("stream active");
- } else {
- this.bout.setBlockDataMode(false);
- this.bout.writeByte(121);
- this.clear();
- this.bout.setBlockDataMode(true);
- }
- }
-
- protected void annotateClass(Class<?> var1) throws IOException {
- }
-
- protected void annotateProxyClass(Class<?> var1) throws IOException {
- }
-
- protected Object replaceObject(Object var1) throws IOException {
- return var1;
- }
-
- protected boolean enableReplaceObject(boolean var1) throws SecurityException {
- if (var1 == this.enableReplace) {
- return var1;
- } else {
- if (var1) {
- SecurityManager var2 = System.getSecurityManager();
- if (var2 != null) {
- var2.checkPermission(SUBSTITUTION_PERMISSION);
- }
- }
-
- this.enableReplace = var1;
- return !this.enableReplace;
- }
- }
-
- protected void writeStreamHeader() throws IOException {
- this.bout.writeShort(-21267);
- this.bout.writeShort(5);
- }
-
- protected void writeClassDescriptor(ObjectStreamClass var1) throws IOException {
- var1.writeNonProxy(this);
- }
-
- public void write(int var1) throws IOException {
- this.bout.write(var1);
- }
-
- public void write(byte[] var1) throws IOException {
- this.bout.write(var1, 0, var1.length, false);
- }
-
- public void write(byte[] var1, int var2, int var3) throws IOException {
- if (var1 == null) {
- throw new NullPointerException();
- } else {
- int var4 = var2 + var3;
- if (var2 >= 0 && var3 >= 0 && var4 <= var1.length && var4 >= 0) {
- this.bout.write(var1, var2, var3, false);
- } else {
- throw new IndexOutOfBoundsException();
- }
- }
- }
-
- public void flush() throws IOException {
- this.bout.flush();
- }
-
- protected void drain() throws IOException {
- this.bout.drain();
- }
-
- public void close() throws IOException {
- this.flush();
- this.clear();
- this.bout.close();
- }
-
- public void writeBoolean(boolean var1) throws IOException {
- this.bout.writeBoolean(var1);
- }
-
- public void writeByte(int var1) throws IOException {
- this.bout.writeByte(var1);
- }
-
- public void writeShort(int var1) throws IOException {
- this.bout.writeShort(var1);
- }
-
- public void writeChar(int var1) throws IOException {
- this.bout.writeChar(var1);
- }
-
- public void writeInt(int var1) throws IOException {
- this.bout.writeInt(var1);
- }
-
- public void writeLong(long var1) throws IOException {
- this.bout.writeLong(var1);
- }
-
- public void writeFloat(float var1) throws IOException {
- this.bout.writeFloat(var1);
- }
-
- public void writeDouble(double var1) throws IOException {
- this.bout.writeDouble(var1);
- }
-
- public void writeBytes(String var1) throws IOException {
- this.bout.writeBytes(var1);
- }
-
- public void writeChars(String var1) throws IOException {
- this.bout.writeChars(var1);
- }
-
- public void writeUTF(String var1) throws IOException {
- this.bout.writeUTF(var1);
- }
-
- int getProtocolVersion() {
- return this.protocol;
- }
-
- void writeTypeString(String var1) throws IOException {
- if (var1 == null) {
- this.writeNull();
- } else {
- int var2;
- if ((var2 = this.handles.lookup(var1)) != -1) {
- this.writeHandle(var2);
- } else {
- this.writeString(var1, false);
- }
- }
-
- }
-
- private void verifySubclass() {
- Class var1 = this.getClass();
- if (var1 != ObjectOutputStream.class) {
- SecurityManager var2 = System.getSecurityManager();
- if (var2 != null) {
- ObjectStreamClass.processQueue(java.io.ObjectOutputStream.Caches.subclassAuditsQueue, java.io.ObjectOutputStream.Caches.subclassAudits);
- ObjectStreamClass.WeakClassKey var3 = new ObjectStreamClass.WeakClassKey(var1, java.io.ObjectOutputStream.Caches.subclassAuditsQueue);
- Boolean var4 = (Boolean)java.io.ObjectOutputStream.Caches.subclassAudits.get(var3);
- if (var4 == null) {
- var4 = auditSubclass(var1);
- java.io.ObjectOutputStream.Caches.subclassAudits.putIfAbsent(var3, var4);
- }
-
- if (!var4) {
- var2.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
- }
- }
- }
- }
-
- private static boolean auditSubclass(Class var0) {
- Boolean var1 = (Boolean)AccessController.doPrivileged(new 1(var0));
- return var1;
- }
-
- private void clear() {
- this.subs.clear();
- this.handles.clear();
- }
-
- private void writeObject0(Object var1, boolean var2) throws IOException {
- boolean var3 = this.bout.setBlockDataMode(false);
- ++this.depth;
-
- try {
- if ((var1 = this.subs.lookup(var1)) != null) {
- int var4;
- if (!var2 && (var4 = this.handles.lookup(var1)) != -1) {
- this.writeHandle(var4);
- return;
- }
-
- if (var1 instanceof Class) {
- this.writeClass((Class)var1, var2);
- return;
- }
-
- if (var1 instanceof ObjectStreamClass) {
- this.writeClassDesc((ObjectStreamClass)var1, var2);
- return;
- }
-
- Object var5 = var1;
- Class var6 = var1.getClass();
-
- while(true) {
- ObjectStreamClass var7 = ObjectStreamClass.lookup(var6, true);
- Class var8;
- if (!var7.hasWriteReplaceMethod() || (var1 = var7.invokeWriteReplace(var1)) == null || (var8 = var1.getClass()) == var6) {
- if (this.enableReplace) {
- Object var14 = this.replaceObject(var1);
- if (var14 != var1 && var14 != null) {
- var6 = var14.getClass();
- var7 = ObjectStreamClass.lookup(var6, true);
- }
-
- var1 = var14;
- }
-
- if (var1 != var5) {
- this.subs.assign(var5, var1);
- if (var1 == null) {
- this.writeNull();
- return;
- }
-
- if (!var2 && (var4 = this.handles.lookup(var1)) != -1) {
- this.writeHandle(var4);
- return;
- }
-
- if (var1 instanceof Class) {
- this.writeClass((Class)var1, var2);
- return;
- }
-
- if (var1 instanceof ObjectStreamClass) {
- this.writeClassDesc((ObjectStreamClass)var1, var2);
- return;
- }
- }
-
- if (var1 instanceof String) {
- this.writeString((String)var1, var2);
- return;
- } else if (var6.isArray()) {
- this.writeArray(var1, var7, var2);
- return;
- } else {
- if (var1 instanceof Enum) {
- this.writeEnum((Enum)var1, var7, var2);
- } else {
- if (!(var1 instanceof Serializable)) {
- if (extendedDebugInfo) {
- throw new NotSerializableException(var6.getName() + "\n" + this.debugInfoStack.toString());
- }
-
- throw new NotSerializableException(var6.getName());
- }
-
- this.writeOrdinaryObject(var1, var7, var2);
- }
-
- return;
- }
- }
-
- var6 = var8;
- }
- }
-
- this.writeNull();
- } finally {
- --this.depth;
- this.bout.setBlockDataMode(var3);
- }
-
- }
-
- private void writeNull() throws IOException {
- this.bout.writeByte(112);
- }
-
- private void writeHandle(int var1) throws IOException {
- this.bout.writeByte(113);
- this.bout.writeInt(8257536 + var1);
- }
-
- private void writeClass(Class var1, boolean var2) throws IOException {
- this.bout.writeByte(118);
- this.writeClassDesc(ObjectStreamClass.lookup(var1, true), false);
- this.handles.assign(var2 ? null : var1);
- }
-
- private void writeClassDesc(ObjectStreamClass var1, boolean var2) throws IOException {
- if (var1 == null) {
- this.writeNull();
- } else {
- int var3;
- if (!var2 && (var3 = this.handles.lookup(var1)) != -1) {
- this.writeHandle(var3);
- } else if (var1.isProxy()) {
- this.writeProxyDesc(var1, var2);
- } else {
- this.writeNonProxyDesc(var1, var2);
- }
- }
-
- }
-
- private void writeProxyDesc(ObjectStreamClass var1, boolean var2) throws IOException {
- this.bout.writeByte(125);
- this.handles.assign(var2 ? null : var1);
- Class var3 = var1.forClass();
- Class[] var4 = var3.getInterfaces();
- this.bout.writeInt(var4.length);
-
- for(int var5 = 0; var5 < var4.length; ++var5) {
- this.bout.writeUTF(var4[var5].getName());
- }
-
- this.bout.setBlockDataMode(true);
- this.annotateProxyClass(var3);
- this.bout.setBlockDataMode(false);
- this.bout.writeByte(120);
- this.writeClassDesc(var1.getSuperDesc(), false);
- }
-
- private void writeNonProxyDesc(ObjectStreamClass var1, boolean var2) throws IOException {
- this.bout.writeByte(114);
- this.handles.assign(var2 ? null : var1);
- if (this.protocol == 1) {
- var1.writeNonProxy(this);
- } else {
- this.writeClassDescriptor(var1);
- }
-
- Class var3 = var1.forClass();
- this.bout.setBlockDataMode(true);
- this.annotateClass(var3);
- this.bout.setBlockDataMode(false);
- this.bout.writeByte(120);
- this.writeClassDesc(var1.getSuperDesc(), false);
- }
-
- private void writeString(String var1, boolean var2) throws IOException {
- this.handles.assign(var2 ? null : var1);
- long var3 = this.bout.getUTFLength(var1);
- if (var3 <= 65535L) {
- this.bout.writeByte(116);
- this.bout.writeUTF(var1, var3);
- } else {
- this.bout.writeByte(124);
- this.bout.writeLongUTF(var1, var3);
- }
-
- }
-
- private void writeArray(Object var1, ObjectStreamClass var2, boolean var3) throws IOException {
- this.bout.writeByte(117);
- this.writeClassDesc(var2, false);
- this.handles.assign(var3 ? null : var1);
- Class var4 = var2.forClass().getComponentType();
- if (var4.isPrimitive()) {
- if (var4 == Integer.TYPE) {
- int[] var5 = (int[])var1;
- this.bout.writeInt(var5.length);
- this.bout.writeInts(var5, 0, var5.length);
- } else if (var4 == Byte.TYPE) {
- byte[] var16 = (byte[])var1;
- this.bout.writeInt(var16.length);
- this.bout.write(var16, 0, var16.length, true);
- } else if (var4 == Long.TYPE) {
- long[] var17 = (long[])var1;
- this.bout.writeInt(var17.length);
- this.bout.writeLongs(var17, 0, var17.length);
- } else if (var4 == Float.TYPE) {
- float[] var18 = (float[])var1;
- this.bout.writeInt(var18.length);
- this.bout.writeFloats(var18, 0, var18.length);
- } else if (var4 == Double.TYPE) {
- double[] var19 = (double[])var1;
- this.bout.writeInt(var19.length);
- this.bout.writeDoubles(var19, 0, var19.length);
- } else if (var4 == Short.TYPE) {
- short[] var20 = (short[])var1;
- this.bout.writeInt(var20.length);
- this.bout.writeShorts(var20, 0, var20.length);
- } else if (var4 == Character.TYPE) {
- char[] var21 = (char[])var1;
- this.bout.writeInt(var21.length);
- this.bout.writeChars(var21, 0, var21.length);
- } else {
- if (var4 != Boolean.TYPE) {
- throw new InternalError();
- }
-
- boolean[] var22 = (boolean[])var1;
- this.bout.writeInt(var22.length);
- this.bout.writeBooleans(var22, 0, var22.length);
- }
- } else {
- Object[] var23 = var1;
- int var6 = var23.length;
- this.bout.writeInt(var6);
- if (extendedDebugInfo) {
- this.debugInfoStack.push("array (class \"" + var1.getClass().getName() + "\", size: " + var6 + ")");
- }
-
- try {
- for(int var7 = 0; var7 < var6; ++var7) {
- if (extendedDebugInfo) {
- this.debugInfoStack.push("element of array (index: " + var7 + ")");
- }
-
- try {
- this.writeObject0(var23[var7], false);
- } finally {
- if (extendedDebugInfo) {
- this.debugInfoStack.pop();
- }
-
- }
- }
- } finally {
- if (extendedDebugInfo) {
- this.debugInfoStack.pop();
- }
-
- }
- }
-
- }
-
- private void writeEnum(Enum var1, ObjectStreamClass var2, boolean var3) throws IOException {
- this.bout.writeByte(126);
- ObjectStreamClass var4 = var2.getSuperDesc();
- this.writeClassDesc(var4.forClass() == Enum.class ? var2 : var4, false);
- this.handles.assign(var3 ? null : var1);
- this.writeString(var1.name(), false);
- }
-
- private void writeOrdinaryObject(Object var1, ObjectStreamClass var2, boolean var3) throws IOException {
- if (extendedDebugInfo) {
- this.debugInfoStack.push((this.depth == 1 ? "root " : "") + "object (class \"" + var1.getClass().getName() + "\", " + var1.toString() + ")");
- }
-
- try {
- var2.checkSerialize();
- this.bout.writeByte(115);
- this.writeClassDesc(var2, false);
- this.handles.assign(var3 ? null : var1);
- if (var2.isExternalizable() && !var2.isProxy()) {
- this.writeExternalData((Externalizable)var1);
- } else {
- this.writeSerialData(var1, var2);
- }
- } finally {
- if (extendedDebugInfo) {
- this.debugInfoStack.pop();
- }
-
- }
-
- }
-
- private void writeExternalData(Externalizable var1) throws IOException {
- Object var2 = this.curObj;
- ObjectStreamClass var3 = this.curDesc;
- PutFieldImpl var4 = this.curPut;
- this.curObj = var1;
- this.curDesc = null;
- this.curPut = null;
- if (extendedDebugInfo) {
- this.debugInfoStack.push("writeExternal data");
- }
-
- try {
- if (this.protocol == 1) {
- var1.writeExternal(this);
- } else {
- this.bout.setBlockDataMode(true);
- var1.writeExternal(this);
- this.bout.setBlockDataMode(false);
- this.bout.writeByte(120);
- }
- } finally {
- if (extendedDebugInfo) {
- this.debugInfoStack.pop();
- }
-
- }
-
- this.curObj = var2;
- this.curDesc = var3;
- this.curPut = var4;
- }
-
- private void writeSerialData(Object var1, ObjectStreamClass var2) throws IOException {
- ObjectStreamClass.ClassDataSlot[] var3 = var2.getClassDataLayout();
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- ObjectStreamClass var5 = var3[var4].desc;
- if (var5.hasWriteObjectMethod()) {
- Object var6 = this.curObj;
- ObjectStreamClass var7 = this.curDesc;
- PutFieldImpl var8 = this.curPut;
- this.curObj = var1;
- this.curDesc = var5;
- this.curPut = null;
- if (extendedDebugInfo) {
- this.debugInfoStack.push("custom writeObject data (class \"" + var5.getName() + "\")");
- }
-
- try {
- this.bout.setBlockDataMode(true);
- var5.invokeWriteObject(var1, this);
- this.bout.setBlockDataMode(false);
- this.bout.writeByte(120);
- } finally {
- if (extendedDebugInfo) {
- this.debugInfoStack.pop();
- }
-
- }
-
- this.curObj = var6;
- this.curDesc = var7;
- this.curPut = var8;
- } else {
- this.defaultWriteFields(var1, var5);
- }
- }
-
- }
-
- private void defaultWriteFields(Object var1, ObjectStreamClass var2) throws IOException {
- var2.checkDefaultSerialize();
- int var3 = var2.getPrimDataSize();
- if (this.primVals == null || this.primVals.length < var3) {
- this.primVals = new byte[var3];
- }
-
- var2.getPrimFieldValues(var1, this.primVals);
- this.bout.write(this.primVals, 0, var3, false);
- ObjectStreamField[] var4 = var2.getFields(false);
- Object[] var5 = new Object[var2.getNumObjFields()];
- int var6 = var4.length - var5.length;
- var2.getObjFieldValues(var1, var5);
-
- for(int var7 = 0; var7 < var5.length; ++var7) {
- if (extendedDebugInfo) {
- this.debugInfoStack.push("field (class \"" + var2.getName() + "\", name: \"" + var4[var6 + var7].getName() + "\", type: \"" + var4[var6 + var7].getType() + "\")");
- }
-
- try {
- this.writeObject0(var5[var7], var4[var6 + var7].isUnshared());
- } finally {
- if (extendedDebugInfo) {
- this.debugInfoStack.pop();
- }
-
- }
- }
-
- }
-
- private void writeFatalException(IOException var1) throws IOException {
- this.clear();
- boolean var2 = this.bout.setBlockDataMode(false);
-
- try {
- this.bout.writeByte(123);
- this.writeObject0(var1, false);
- this.clear();
- } finally {
- this.bout.setBlockDataMode(var2);
- }
-
- }
-
- private static native void floatsToBytes(float[] var0, int var1, byte[] var2, int var3, int var4);
-
- private static native void doublesToBytes(double[] var0, int var1, byte[] var2, int var3, int var4);
-
- // $FF: synthetic method
- static BlockDataOutputStream access$000(ObjectOutputStream var0) {
- return var0.bout;
- }
-
- // $FF: synthetic method
- static boolean access$100() {
- return extendedDebugInfo;
- }
-
- // $FF: synthetic method
- static DebugTraceInfoStack access$200(ObjectOutputStream var0) {
- return var0.debugInfoStack;
- }
-
- // $FF: synthetic method
- static void access$300(ObjectOutputStream var0, Object var1, boolean var2) throws IOException {
- var0.writeObject0(var1, var2);
- }
-
- // $FF: synthetic method
- static void access$400(float[] var0, int var1, byte[] var2, int var3, int var4) {
- floatsToBytes(var0, var1, var2, var3, var4);
- }
-
- // $FF: synthetic method
- static void access$500(double[] var0, int var1, byte[] var2, int var3, int var4) {
- doublesToBytes(var0, var1, var2, var3, var4);
- }
- }
-